package com.learning.servlet2x.session;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * ClassName: SessionServlet
 * Description: Session 会话
 * Date: 2018/6/24 21:01 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class SessionServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
//
        boolean isValid = request.isRequestedSessionIdValid();
        System.out.println("请求带过来的session是否有效 : " + isValid);

        // 第一次访问的时候 firefox 为空，而chrome 确是有值的，但是和下面创建的session不是同一个
        String requestedSessionId = request.getRequestedSessionId();
        System.out.println("request获取的SessionID : " + requestedSessionId);

        boolean isFromCookie = request.isRequestedSessionIdFromCookie();
        boolean isFromUrl = request.isRequestedSessionIdFromURL();
        System.out.println("是否是通过Cookie实现: " + isFromCookie + " | 是否是通过URL实现: " + isFromUrl);


        // 1-Session的创建
        //不存在，返回空
        HttpSession session = request.getSession();
        //不存在，新建一个
        session = request.getSession(true);

        System.out.println("获取到的Session 为 ： " + session.getClass().getName());

        // 2-Session的ID
        String sessionId = session.getId();
        System.out.println("创建的 Session的ID 为 ： " + sessionId);

        // 3-session的时间：三个时间构成了session 的生命周期

        // 3-1 有效期
        // get/set MaxInactiveInterval可以设置和获取session的有效期  单位为 秒
        // 也可以通过 <session-config>标签配置在web.xml中 ，单位为分钟
        // tomcat自身的config/web.xml 默认配置session有效期为 30 分钟
        // 如通过setMaxInactiveInterval设置过有效时间,这段代码注掉，时间还是不会改变。

        session.setMaxInactiveInterval(1000 * 5);
        int time = session.getMaxInactiveInterval();
        System.out.println("Session的有效期 为 ： " + time);


        // 3-2 创建时间
        long createTime = session.getCreationTime();
        Date createDate = new Date(createTime);
        System.out.println("Session创建的时间为 ： " + formatDate(createDate));

        // 3-3 最近访问时间
        // 客户端只要访问服务器，不管有没有读写session，服务器都会更新最近访问时间，并维护本session
        long accessedTime = session.getLastAccessedTime();
        Date accessedDate = new Date(accessedTime);
        System.out.println("Session最近访问的时间为 ： " + formatDate(accessedDate));


        // 4-常用方法

        // 4-1设置 Attribute 是key-value类型
        // key为String 类型， value为 Object 。可以放置javaBean。比Cookie强大。

        session.setAttribute("user", "Sam");
        String userName = (String) session.getAttribute("user");
        System.out.println("Session中放置的数据   ： " + userName);

        session.removeAttribute("user");

        // 4-2 让session失效
        session.invalidate();

//      // 通过 重写URL实现
//      response.encodeURL("/");
//      response.encodeRedirectURL("/");
//      response.sendRedirect(response.encodeRedirectURL("/"));
    }

    /**
     * 简单转换时间
     *
     * @param date
     * @return
     */
    private String formatDate(Date date) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String strDate = format.format(date);
        return strDate;

    }
}
